<?php

namespace Cekurte\Cli\Command;
 
use Symfony\Component\Console\Input\InputArgument,
    Symfony\Component\Console\Input\InputOption,
    Symfony\Component\Console\Command\Command,
    Symfony\Component\Console\Input\InputInterface,
    Symfony\Component\Console\Output\OutputInterface,
    Symfony\Component\Console\Input\ArrayInput;
 
/**
 * Classe responsável por regerar o banco de dados, com base nos arquivos
 * criados pelo doctrine 2
 *
 * @author 	João Paulo Cercal
 * @version 1.0
 */
class Database extends Command
{
	/**
	 * @var stdClass Armazena os argumentos informados pelo usuário
	 */
	private $options 	= null;
	
    /**
     * Disponibiliza na propriedade privada $this->options desta classe os argumentos informados pelo usuário
     * 
     * @param 	InputInterface $input
     * @param 	array|object $options contendo valores referentes as chaves da propriedade privada $this->path desta classe
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     */
	private function setOptions( $input, $options )
    {
    	$this->options = new \stdClass();
    	
    	foreach( $options as $option )
    	{
    		$this->options->{$option} = $input->getOption($option);
    	}
    }
	
	/**
     * Recria o banco de dados
     * 
     * @param 	OutputInterface $output
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     */
	private function rebuildDatabase( $output )
	{
		// -------------------------------------------------------------------------
		// Drop Database
	
		$command = $this->getApplication()->find('orm:schema-tool:drop');

	    $arguments = array(
	        'command' 			=> 'orm:schema-tool:drop',
	        '--force'  			=> true,
	    	'--full-database'  	=> true,
	    );
	    
	    if( !empty($this->options->{'dump-sql'}) )
	    {
	    	$arguments['--dump-sql'] = true;
	    }
	
	    $input 	= new ArrayInput($arguments);
	    
	    $command->run($input, $output);
	    
	    // -------------------------------------------------------------------------
		// Create Database
	
		$command 	= $this->getApplication()->find('orm:schema-tool:create');

	    $arguments 	= array(
	        'command' 			=> 'orm:schema-tool:create',
	    );
	    
		if( !empty($this->options->{'dump-sql'}) )
	    {
	    	$arguments['--dump-sql'] = true;
	    }
	
	    $input = new ArrayInput($arguments);
	    
	    $command->run($input, $output);
	    
	    //var_dump( $output );
	}
    

    protected function configure() 
    {
    	$this->setName('cekurte:database')
        ->setDescription('Recriacao do banco de dados, com base nos arquivos criados pelo doctrine 2.')
        ->setDefinition( array(
        
        	new InputOption('rebuild', null, InputOption::VALUE_NONE, 
            	'Recria o banco de dados.'),
        	
        	new InputOption('dump-sql', null, InputOption::VALUE_NONE, 
            	'Dump dos comando SQL.'),

        ))
        ->setHelp(<<<EOT
Recriacao do banco de dados.
EOT
        );
    }
    
    protected function execute(InputInterface $input, OutputInterface $output) 
    {
    	// ---------------------------------------------------------
    	// Armazena as opções disponíveis
    	
    	$this->setOptions( $input, array(
    		'rebuild', 
    		'dump-sql',
    	));
    	
    	// ---------------------------------------------------------
    	// Ex: --rebuild
    	
    	if( !empty( $this->options->rebuild ) )
    	{
    		$this->rebuildDatabase( $output );
    	}
    }
    
}